package com.hey.jvm.v22;

/**
 * 通义灵码：
 * 虚拟线程（Virtual Threads，最初在Project Loom项目中提出）是Java平台的一项重大改进，旨在简化并发编程，提高应用程序的可伸缩性和响应性。它们是Java虚拟机（JVM）管理的一种轻量级线程，设计目标是让开发者能够创建大量线程而不必担心传统操作系统线程带来的资源开销。以下是关于虚拟线程的详细说明：
 * 核心概念
 * 轻量级：虚拟线程相比于操作系统线程（有时称为“物理线程”或“平台线程”）更加轻量。它们不需要分配单独的操作系统线程，因此创建和销毁的开销极低，使得创建百万级别的线程成为可能。
 * 自动调度：虚拟线程由JVM自动管理，包括调度、上下文切换等，开发者无需关心这些底层细节。JVM会将虚拟线程映射到有限数量的平台线程上执行，实现资源的有效利用。
 * 阻塞优化：虚拟线程在执行I/O操作或等待锁等阻塞操作时，不会占用操作系统线程资源。JVM可以将阻塞的虚拟线程挂起，释放对应的平台线程资源给其他任务使用，从而提高了系统整体的并发能力。
 * 生命周期管理：虚拟线程通常作为守护线程运行，这意味着当主线程结束时，虚拟线程会被自动终止，无需手动管理它们的生命周期。
 * 使用场景
 * 高并发服务器：在处理大量并发请求的Web服务器、数据库连接池等场景，虚拟线程可以为每个请求或连接分配一个线程，简化编程模型同时保持高性能。
 * 异步编程简化：对于复杂的异步逻辑，虚拟线程可以通过阻塞API模拟同步行为，降低编程复杂度。
 * 事件驱动和反应式系统：在需要快速响应用户交互或处理事件流的应用中，虚拟线程可以有效提升系统的响应速度和吞吐量。
 * 关键API
 * Thread.startVirtualThread(Runnable)：用于启动一个新的虚拟线程来执行给定的任务。
 * Thread.ofVirtual().start(Runnable)：另一种创建并启动虚拟线程的方式，提供了更多配置选项。
 * StructuredConcurrency：虽然不是直接关于虚拟线程，但StructuredConcurrency API与虚拟线程紧密相关，帮助管理一组相关的任务，确保它们在同一个上下文中执行，便于错误处理和资源管理。
 * 注意事项
 * 性能考量：虽然虚拟线程大大降低了线程创建的成本，但不当的设计（如过度的线程竞争、频繁的线程切换）仍可能影响性能。
 * 资源限制：尽管虚拟线程轻量，但系统资源（如内存、CPU）仍然是有限的，过度使用仍可能导致资源耗尽。
 * 兼容性：虚拟线程是JDK的新特性，可能需要特定版本的JDK支持，并且可能会影响到现有基于传统线程模型的代码。
 *
 * 虚拟线程的引入，标志着Java在现代并发编程领域的一大进步，为开发者提供了更强大、更易用的并发工具，有助于构建更高效、响应更快的应用程序。
 *
 * */
public class VirtualThreadExample {
/**
 *
 * java: startVirtualThread(java.lang.Runnable) 是预览 API，默认情况下处于禁用状态。
 *   （请使用 --enable-preview 以启用预览 API）
 *   */
    public static void main(String[] args) {
        // 创建一个任务，用于在虚拟线程上执行
        Runnable task = () -> {
            String threadName = Thread.currentThread().getName();
            System.out.println("Hello from " + threadName);
            try {
                Thread.sleep(1000); // 模拟一些工作
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
        };

        // 在虚拟线程上执行任务
        for (int i = 0; i < 10; i++) {
            var virtualThread = Thread.startVirtualThread(task); // 使用Thread.startVirtualThread启动虚拟线程
            System.out.println("Started Virtual Thread: " + virtualThread.getName());
        }

        System.out.println("Main thread waiting for all tasks to finish...");
        // 在这里等待所有虚拟线程完成不是必需的，因为虚拟线程是守护线程，
        // 但如果是非守护线程，你需要适当的同步机制来等待它们结束。
    }
}
